// 定义旋转角度的 uniform 变量
uniform float rotation;
// 定义是否启用尺寸衰减的 uniform 变量
uniform bool sizeAttenuation;
// 定义中心点的 uniform 变量
uniform vec2 center;
// 定义缩放比例的 uniform 变量
uniform float zoom;
// 定义视图缩放比例的 uniform 变量
uniform float viewScale;
// 定义尺寸缩放比例的 uniform 变量
uniform float sizeScale;
// 定义模型缩放比例的 uniform 变量
uniform float modelScale;
//根据相机到模型的距离范围来缩放（指定范围内不变）
uniform vec2 distanceScaleRange;

//
uniform vec2 heightRange;

// 定义传递到片段着色器的变量，用于存储 UV 坐标
varying vec2 vUv;

varying vec3 testColor;

// 包含一些通用的 GLSL 代码
#include <common>
// 包含与 UV 坐标相关的代码
#include <uv_pars_vertex>
// 包含与雾效果相关的代码
#include <fog_pars_vertex>
// 包含与深度缓冲日志相关的代码
#include <logdepthbuf_pars_vertex>
// 包含与裁剪平面相关的代码
#include <clipping_planes_pars_vertex>

void main() {
  // 将传入的 UV 坐标赋值给 vUv，供片段着色器使用
  vUv = uv;

  testColor = vec3(0.46, 1.0, 0.05);
  // 计算模型视图矩阵与原点 (0, 0, 0, 1) 的乘积，得到模型在视图空间中的位置
  vec4 mvPosition = modelViewMatrix * vec4(0.0, 0.0, 0.0, 1.0);

  // 判断投影矩阵是否为透视投影
  bool isPerspective = isPerspectiveMatrix(projectionMatrix);

  // 定义一个 2D 向量用于存储缩放比例
  vec2 scale;

  // 根据投影类型计算缩放比例
  if(isPerspective) {
    // 如果是透视投影，使用模型矩阵的列向量长度计算缩放比例
    scale.x = length(vec3(modelMatrix[0].x, modelMatrix[0].y, modelMatrix[0].z)) * modelScale;
    scale.y = length(vec3(modelMatrix[1].x, modelMatrix[1].y, modelMatrix[1].z)) * modelScale;
  } else {
    // 如果是正交投影，使用视图缩放比例计算缩放比例
    scale.x = 1.0 / viewScale * modelScale;
    scale.y = 1.0 / viewScale * modelScale;
  }

// //此处为相机的高度
//   if(heightRange.x <= cameraPosition.y && cameraPosition.y <= heightRange.y) {
//     testColor = vec3(0.5, 0.0, 1.0);
//   }

  // 如果启用了尺寸衰减，根据投影类型调整缩放比例
  if(sizeAttenuation) {
    if(isPerspective) {

      float distanceToCamera = (-mvPosition.z);

      if(distanceScaleRange.x < distanceScaleRange.y) {
        if((-mvPosition.z) <= distanceScaleRange.x) {
        // testColor = vec3(1.0, 0.0, 0.0);
          distanceToCamera = (distanceScaleRange.x);
        } else if((-mvPosition.z) >= distanceScaleRange.y) {

        // testColor = vec3(0.0, 0.28, 1.0);
          distanceToCamera = (distanceScaleRange.y);
        }
      }
      // 透视投影下，缩放比例与深度值成反比
      scale *= distanceToCamera;

    } else {
      // 正交投影下，缩放比例与视图缩放和缩放比例成正比
      scale *= (viewScale / zoom);
    }
  }

  // 计算对齐后的顶点位置
  vec2 alignedPosition = (position.xy - center) * scale;

  // 定义一个 2D 向量用于存储旋转后的顶点位置
  vec2 rotatedPosition;

  // 应用旋转变换
  rotatedPosition.x = cos(rotation) * alignedPosition.x - sin(rotation) * alignedPosition.y;
  rotatedPosition.y = sin(rotation) * alignedPosition.x + cos(rotation) * alignedPosition.y;

  // 将旋转后的顶点位置添加到模型视图矩阵的位置
  mvPosition.xy += rotatedPosition;

  // 计算最终的裁剪空间位置
  gl_Position = projectionMatrix * mvPosition;

  // 包含深度缓冲日志的代码
  #include <logdepthbuf_vertex>
  // 包含裁剪平面的代码
  #include <clipping_planes_vertex>
  // 包含雾效果的代码
  #include <fog_vertex>
}
